맨위로가기

Zig (프로그래밍 언어)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

Zig는 C 언어를 개선하는 것을 목표로 설계된 시스템 프로그래밍 언어이다. 컴파일 타임 제네릭, 리플렉션, 수동 메모리 관리 등을 지원하며, C/C++ 컴파일러를 포함하여 C 코드와 상호 운용성을 제공한다. Zig는 C 언어의 메모리 관리 문제를 해결하기 위해 옵션 타입을 사용하고, 할당자를 통해 메모리 할당을 관리한다. 또한, 크로스 컴파일을 주요 기능으로 지원하며, 컴파일 타임 코드 실행을 통해 매크로 및 조건부 컴파일 기능을 제공한다. Zig는 0.10 버전부터 자기 호스팅 컴파일러를 사용하며, 번(Bun)과 같은 프로젝트에서 활용된다.

더 읽어볼만한 페이지

  • C 컴파일러 - GNU 컴파일러 모음
    GNU 컴파일러 모음(GCC)은 리처드 스톨먼이 1987년 처음 출시한 자유 소프트웨어 컴파일러 시스템으로, C, C++, Fortran, Ada, Go 등 다양한 프로그래밍 언어를 지원하며 여러 명령어 집합 아키텍처와 플랫폼에서 널리 사용된다.
  • C 컴파일러 - MinGW
    MinGW는 윈도우에서 GNU 툴체인을 사용할 수 있게 해주는 프로젝트이며, MSYS를 통해 유닉스 셸 환경을 제공하고, C, C++, Objective-C 등 다양한 언어를 지원하며 윈도우 API를 직접 호출하여 호환성 계층 DLL을 요구하지 않는다.
  • 시스템 프로그래밍 언어 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • 시스템 프로그래밍 언어 - 스위프트 (프로그래밍 언어)
    2014년 애플 세계 개발자 컨퍼런스에서 처음 공개된 스위프트는 크리스 래트너가 개발한 애플의 범용 프로그래밍 언어로서, Objective-C를 대체하며 다양한 플랫폼 지원, 모던 문법, 안정성, 인터랙티브한 개발 환경, SwiftUI 등의 특징을 가진다.
  • 정적 타입 프로그래밍 언어 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • 정적 타입 프로그래밍 언어 - 핵 (프로그래밍 언어)
    Hack은 페이스북에서 개발한 프로그래밍 언어이며, PHP와 상호 운용되도록 설계되었고, 정적 타이핑을 도입하여 타입 힌트를 확장하며 PHP 7에도 영향을 미쳤다.
Zig (프로그래밍 언어) - [IT 관련 정보]에 관한 문서
기본 정보
지그 로고
지그 로고
개발자앤드루 켈리
발표일2016년 2월 8일
최신 미리보기 날짜}}
파일 확장자.zig, .zir, .zigr, .zon
웹사이트지그 공식 웹사이트
영향을 받은 언어C
C++
LLVM IR
Go
Rust
자바스크립트
특징
패러다임명령형
병행
절차적
함수형
타입정적
강한
추론
구조적
제네릭
메모리 관리수동
플랫폼x86-64
ARM64
웹어셈블리
Tier 2: ARM, IA-32, RISC-V, MIPS64, POWERPC64, SPARC64
일부 Tier 2 플랫폼은 독립 실행형 프로그램에 대한 Tier 1 지원을 제공함
운영 체제크로스 플랫폼: 리눅스, 프리비에스디, 윈도우
라이선스MIT

2. 특징

Zig는 컴파일 타임제네릭, 리플렉션, 평가, 크로스 컴파일을 지원하며, 수동 메모리 관리를 사용한다.[11] 이 언어는 C 언어를 개선하는 것을 주 목표로 하며,[9][12] Rust 등 다른 언어들로부터 영감을 받았다.[13] 로우 레벨 프로그래밍을 위한 여러 기능을 제공하는데, 특히 팩 구조체(필드 사이에 패딩이 없는 구조체), 임의 너비 정수[14], 여러 포인터 유형[15] 등이 있다.

Zig는 새로운 언어이면서 동시에 C/C++ 컴파일러를 포함하고 있어, C/C++와 함께 사용하거나 둘 중 하나와 함께 사용할 수 있다.

2. 1. 목표

Zig의 주된 목표는 C로 해결되는 종류의 작업에 대한 더 나은 해결책이 되는 것이다. 이와 관련하여 주요 관심사는 가독성이다. Zig는 가능한 경우 기존의 개념과 구문을 사용하여 유사한 개념에 대한 다른 구문을 추가하는 것을 피한다. 또한 안전성, 최적화 및 테스트를 개선하기 위한 다양한 기능을 포함하여 "강건함, 최적성 및 유지 관리성"을 위해 설계되었다. 작고 단순한 구문은 유지 관리의 중요한 부분이며, 유지 관리자가 익숙하지 않을 수 있는 언어의 복잡성을 배우지 않고도 코드를 디버깅할 수 있도록 하는 것이 언어의 목표이다. 이러한 변경 사항에도 불구하고 Zig는 기존 C 코드로 컴파일할 수 있으며 C 코드에 대해 컴파일할 수도 있다. C 헤더는 Zig 프로젝트에 포함될 수 있으며 해당 함수를 호출할 수 있으며, Zig 코드는 컴파일러에서 빌드한 헤더를 포함하여 C 프로젝트에 연결할 수 있다.

코드를 단순하고 읽기 쉽게 만드는 전반적인 디자인 철학에 따라, Zig 시스템 전체는 C 및 기타 C 유사 언어에 비해 여러 가지 스타일 변경 사항을 포함한다. 예를 들어, Rust 언어는 연산자 오버로딩을 가지고 있으며, 이는 `a = b + c`와 같은 구문이 실제로 해당 타입의 plus 연산자의 오버로딩된 버전에 대한 함수 호출일 수 있음을 의미한다. 또한 해당 함수가 패닉 상태가 되어 이후의 코드를 선점할 수도 있다. Zig에서는, 어떤 것이 함수를 호출하면 함수 호출처럼 보이며, 그렇지 않으면 함수 호출처럼 보이지 않는다. 오류가 발생하면 구문에 명시되어 있으며, 오류 처리는 오류 유형을 통해 처리되며 catch 또는 try로 처리할 수 있다.

Zig의 목표는 Go, Rust, Carbon, Nim과 같이 같은 기간에 설계된 다른 많은 언어의 목표와 대조된다. 일반적으로 이러한 언어는 연산자 오버로딩, 값으로 위장한 함수 (속성) 및 대규모 프로그램을 구축하는 데 도움이 되는 기타 많은 기능과 같은 추가 기능으로 더 복잡하다. 이러한 종류의 기능은 C++의 접근 방식과 더 유사하며, 이러한 언어는 해당 언어와 더 유사하다. Zig는 컴파일 시간 제네릭을 지원하고 `comptime` 지시어를 사용하여 덕 타이핑 형태를 수용하여 타입 시스템을 보다 보수적으로 확장한다.

2. 2. 메모리 관리

Zig는 C와 유사한 성능을 목표로 가비지 컬렉션(GC)이나 자동 참조 카운팅(ARC) 대신, 옵션 타입(Option Type)이라는 개념을 사용한다. C에서 `malloc`을 기반으로 하는 메모리 관리 시스템은 메모리 누수나 댕글링 포인터와 같은 버그의 주요 원인이 된다.[4]

옵션 타입은 포인터가 아무것도 가리키지 않는(nil) 대신, 비어있는 데이터를 나타내는 별도의 유형을 사용한다. 이는 포인터와 해당 포인터의 유효성 여부를 나타내는 부울(bool)을 가진 구조체와 유사하지만, 부울의 상태는 언어에 의해 관리되므로 프로그래머가 명시적으로 관리할 필요가 없다. 예를 들어, C에서 null 값을 가진 포인터를 생성하고 사용하려고 시도하면 null 포인터 오류가 발생하지만, 옵션 타입을 사용하면 컴파일 시간에 잠재적인 메모리 문제를 확인할 수 있다.[5][6]

Zig의 메모리 할당은 `libc`의 메모리 관리 함수를 직접 호출하는 대신, 할당자(Allocator) 구조체를 통해 처리된다. 예를 들어, C에서 문자열을 반복하는 함수는 다음과 같다.

```c

const char* repeat(const char* original, size_t times);

```

이 함수 내에서 `malloc` 호출은 호출 함수에 보이지 않으며, 나중에 메모리를 해제하지 않으면 누수가 발생한다. Zig에서는 다음과 같이 할당자를 명시적으로 전달한다.

```zig

fn repeat(allocator: *std.mem.Allocator, original: []const u8, times: usize) std.mem.Allocator.Error![]const u8;

```

`allocator` 변수는 할당을 수행하는 코드를 설명하는 구조체를 전달하고, `repeat` 함수는 결과 문자열 또는 Allocator.Error(옵션 타입)를 반환한다. 할당자를 직접 입력으로 사용함으로써 메모리 할당은 다른 함수 내에 숨겨지지 않고 항상 API에 노출된다. Zig의 표준 라이브러리 내에서는 할당이 수행되지 않으며, 구조체는 모든 것을 가리킬 수 있으므로 프로그램으로 작성된 대체 할당자를 사용할 수도 있다.[7]

옵션 타입은 "값이 없음"이 적절한 응답인 모든 유형의 값에 유용하다. 예를 들어, 정수를 반환하는 함수가 아직 호출되지 않았음을 나타내기 위해 Zig에서는 `var theCountedUsers: ?i32 = null;`과 같이 명확한 "호출되지 않음" 값으로 설정할 수 있다.[7]

Zig는 `defer` 키워드를 제공하여 함수가 종료될 때 특정 코드가 실행되도록 보장한다. 이를 통해 메모리 할당 해제 등을 안전하게 처리할 수 있다.[7] Zig 메모리 관리는 숨겨진 할당을 방지하며, 힙 접근은 명시적으로 표준 라이브러리를 통해 수행된다.[8]

2. 3. C 언어와의 상호 운용성

Zig는 새로운 Zig 코드와 기존 C 코드를 결합하는 점진적인 이식성을 장려한다. 이를 위해 기존 C 라이브러리와의 상호 작용을 최대한 원활하게 만드는 것을 목표로 한다. Zig는 `` 지시문 `@import("std")`를 사용하여 자체 라이브러리를 가져온다.

```zig

const std = @import("std");

```

위 코드를 통해 해당 파일 내의 Zig 코드는 `std` 내의 함수를 호출할 수 있다. 예를 들면 다음과 같다.

```zig

std.debug.print("Hello, world!\n", .{});

```

C 코드를 사용하려면 `@import`를 `@cImport`로 바꾸면 된다.

```zig

const c = @cImport(@cInclude("soundio/soundio.h"));

```

이제 Zig 코드는 `soundio` 라이브러리의 함수를 기본 Zig 코드처럼 호출할 수 있다. Zig는 C의 `int` 및 `float`와 달리 명시적으로 정의된 새로운 데이터 형식을 사용하므로, `@intCast` 및 `@ptrCast`를 포함하여 C와 Zig 유형 간에 데이터를 이동하는 데 몇 가지 지시문이 사용된다.

2. 4. 크로스 컴파일

Zig는 크로스 컴파일을 주요 사용 사례로 취급한다. 모든 Zig 컴파일러는 수십 개에 달하는 모든 대상 플랫폼용 실행 가능한 바이너리를 컴파일할 수 있다. 여기에는 ARM 및 x86-64와 같은 널리 사용되는 최신 시스템뿐만 아니라 PowerPC, SPARC, MIPS, RISC-V 및 IBM의 z/Architecture (S390)도 포함된다. 이 툴체인은 추가 소프트웨어 설치 없이 이러한 모든 대상을 컴파일할 수 있으며, 필요한 모든 지원은 기본 시스템에 있다.

2. 5. 컴파일 타임 (Comptime)

`comptime` 키워드를 사용하여 프로그래머는 코드를 런타임이 아닌 컴파일 타임에 명시적으로 평가하도록 할 수 있다. 컴파일 타임에 코드를 실행할 수 있다는 것은 Zig가 별도의 전처리기 언어 없이 매크로 및 조건부 컴파일 기능을 가질 수 있게 해준다.[9]

컴파일 타임 동안, 타입은 일급 시민이 된다. 이는 컴파일 타임 덕 타이핑을 가능하게 하며, Zig가 제네릭 타입을 구현하는 방식이다.[15]

예를 들어, Zig에서 제네릭 연결 리스트 타입은 다음과 같은 함수를 사용하여 구현될 수 있다.



fn LinkedList(comptime T: type) type;



이 함수는 타입 `T`를 입력으로 받아 해당 데이터 타입을 가진 연결 리스트를 정의하는 사용자 정의 구조체를 반환한다.

2. 6. 기타 특징

Zig는 컴파일 타임 제네릭, 리플렉션, 평가, 크로스 컴파일, 그리고 수동 메모리 관리를 지원한다.[11] 이 언어의 주요 목표는 C 언어를 개선하는 것이며,[9][12] Rust를 비롯한 다른 언어들로부터 영감을 받았다.[13] Zig는 로우 레벨 프로그래밍을 위한 많은 기능을 가지고 있으며, 특히 팩 구조체(필드 사이에 패딩이 없는 구조체), 임의 너비 정수[14] 및 여러 포인터 유형이 있다.[15]

2. 7. 단점

Zig는 몇 가지 단점이 있다. 메모리가 제대로 해제되지 않으면 숨겨진 제어가 없기 때문에 메모리 누수가 발생할 수 있다.[16] Zig의 학습 곡선은 특히 저수준 프로그래밍 개념에 익숙하지 않은 사람들에게는 가파를 수 있다.[16] Zig는 성장하는 커뮤니티를 가지고 있지만, 2024년 현재 성숙도, 생태계 및 도구 측면에서 개선의 여지가 있는 새로운 언어이다.[16] 다른 언어와의 상호 운용성은 데이터 마샬링 및 통신 관리에 추가적인 노력이 필요하므로 어려움을 초래할 수 있다.[16] 마지막으로, 복잡한 사용 사례에 대한 학습 자료의 가용성이 제한적이지만, 관심과 채택이 증가함에 따라 점차 개선되고 있다.[16]

3. 버전

Zig는 0.10 버전부터 자기 호스팅 컴파일러를 사용한다. 즉, 컴파일러가 Zig 프로그래밍 언어 자체로 작성되었다. 이전에는 C++부트스트래핑 컴파일러를 사용했지만, 0.11 버전부터는 제공되지 않는다. 새로운 컴파일러는 메모리 사용량이 적고 컴파일 속도가 약간 더 빠르다. 이전 C++ 기반 컴파일러는 3.5배 더 많은 메모리를 사용했다.

Zig는 기본적으로 LLVM을 백엔드로 사용하여 최적화를 수행한다. LLVM을 사용하는 컴파일러는 169MiB, 사용하지 않는 컴파일러는 4.4MiB이다. 새로운 Zig 기반 컴파일러는 더 빠른 실행 코드를 생성하고, LLVM 코드 생성 기능이 더 뛰어나며, 많은 버그가 수정되었다. 버전 0.10의 이전 컴파일러에도 개선 사항이 있다. 자기 호스팅 링커는 자기 호스팅 컴파일러와 밀접하게 연결되어 있다. 새로운 버전에서는 AMD GPU에 대한 실험적 지원도 추가되었다 (Nvidia GPU 및 PlayStation 4와 5에 대한 지원도 일부 존재한다).

이전의 부트스트래핑 ("stage1") 컴파일러는 Zig와 C++로 작성되었으며, LLVM 13을 백엔드로 사용했다. 컴파일러는 MIT 라이선스로 배포되는 무료 및 오픈 소스 소프트웨어이다. Zig 컴파일러는 `zig cc` 및 `zig c++` 명령을 통해 Clang처럼 C 및 C++를 컴파일할 수 있다. 또한 C 표준 라이브러리 (libc) 및 C++ 표준 라이브러리 (libcxx)를 포함한 다양한 플랫폼용 헤더를 제공하여 Zig의 `cc` 및 `c++` 하위 명령을 크로스 컴파일러로 즉시 사용할 수 있게 한다.

공식적으로 지원되는 운영 체제 외에도, Android NDK를 사용하여 Android용으로, iOS 프로그래밍도 가능하다.

0.11.0 버전 이전에는 Zig에 패키지 관리자가 없었지만, 0.11.0에서 실험적 버전이 출시되었고, 0.12.0에서 확장되었다. 공식 패키지 저장소는 없으며, 패키지는 압축 파일을 가리키는 URL이다. 이 압축 파일에는 표준 build.zig 파일(Zig 컴파일러가 소스 코드를 컴파일하기 위해 관례적으로 사용)과 패키지 이름 및 버전을 정의하는 build.zig.zon 파일이 포함되어야 한다.

Zig 개발은 앤드류 켈리(Andrew Kelley)가 대표로 있는 비영리 법인인 Zig 소프트웨어 재단 (ZSF)에서 지원한다. ZSF는 기부를 받고 여러 정규직 직원을 고용한다.

4. 커뮤니티

Zig 소프트웨어 재단(ZSF)은 매우 활발한 기여 커뮤니티를 가지고 있으며, 아직 개발 초기 단계에 있다.[28] 그럼에도 불구하고, 2024년 스택 오버플로우 설문조사에서 Zig 소프트웨어 개발자는 연평균 103000USD의 급여를 받아 급여가 가장 높은 프로그래밍 언어 중 하나로 나타났다.[29] 하지만, 단 0.83%만이 Zig에 능숙하다고 답했다.[28]

5. 프로젝트

번은 Zig로 작성된 자바스크립트타입스크립트 런타임으로, 사파리의 JavaScriptCore 가상 머신을 사용한다.

5. 1. 번(Bun)

번은 Zig로 작성된 자바스크립트타입스크립트 런타임으로, 사파리의 JavaScriptCore 가상 머신을 사용한다.

6. 코드 예시

zig

// zig 버전 0.9.1

const std = @import("std");

pub fn main() !void {

const stdout = std.io.getStdOut().writer();

try stdout.print("Hello, {s}!\n", .{"world"});

}

```

```zig

// 제네릭 연결 리스트

const std = @import("std");

const stdout = std.io.getStdOut().writer();

fn LinkedList(comptime T: type) type {

return struct {

const Self = @This();

pub const Node = struct {

next: ?*Node = null,

data: T,

};

first: ?*Node = null,

pub fn prepend(list: *Self, new_node: *Node) void {

new_node.next = list.first;

list.first = new_node;

}

pub fn format(

list: Self,

comptime fmt: []const u8,

options: std.fmt.FormatOptions,

out_stream: anytype,

) !void {

try out_stream.writeAll("( ");

var it = list.first;

while (it) |node| : (it = node.next) {

try std.fmt.formatType(node.data, fmt, options, out_stream, 1);

try out_stream.writeAll(" ");

}

try out_stream.writeAll(")");

}

};

}

pub fn main() !void {

const ListU32 = LinkedList(u32);

var list = ListU32{};

var node1 = ListU32.Node{ .data = 1 };

var node2 = ListU32.Node{ .data = 2 };

var node3 = ListU32.Node{ .data = 3 };

list.prepend(&node1);

list.prepend(&node2);

list.prepend(&node3);

try stdout.print("{}\n", .{list});

try stdout.print("{b}\n", .{list});

}

```

실행 결과:

```text

( 3 2 1 )

( 11 10 1 )

```

```zig

const std = @import("std");

fn repeat(

allocator: *std.mem.Allocator,

original: []const u8,

times: usize,

) std.mem.Allocator.Error![]const u8 {

var buffer = try allocator.alloc(

u8,

original.len * times,

);

for (0..times) |i| {

std.mem.copyForwards(

u8,

buffer[(original.len * i)..],

original,

);

}

return buffer;

}

pub fn main() !void {

const stdout = std.io.getStdOut().writer();

var arena = std.heap.ArenaAllocator.init(

std.heap.page_allocator,

);

defer arena.deinit();

var allocator = arena.allocator();

const original = "Hello ";

const repeated = try repeat(

&allocator,

original,

3,

);

// "Hello Hello Hello " 출력

try stdout.print("{s}\n", .{repeated});

}

```
출력 결과```text

Hello Hello Hello

6. 1. Hello World

zig

// zig 버전 0.9.1

const std = @import("std");

pub fn main() !void {

const stdout = std.io.getStdOut().writer();

try stdout.print("Hello, {s}!\n", .{"world"});

}

6. 2. 제네릭 연결 리스트

zig

// 제네릭 연결 리스트

const std = @import("std");

const stdout = std.io.getStdOut().writer();

fn LinkedList(comptime T: type) type {

return struct {

const Self = @This();

pub const Node = struct {

next: ?*Node = null,

data: T,

};

first: ?*Node = null,

pub fn prepend(list: *Self, new_node: *Node) void {

new_node.next = list.first;

list.first = new_node;

}

pub fn format(

list: Self,

comptime fmt: []const u8,

options: std.fmt.FormatOptions,

out_stream: anytype,

) !void {

try out_stream.writeAll("( ");

var it = list.first;

while (it) |node| : (it = node.next) {

try std.fmt.formatType(node.data, fmt, options, out_stream, 1);

try out_stream.writeAll(" ");

}

try out_stream.writeAll(")");

}

};

}

pub fn main() !void {

const ListU32 = LinkedList(u32);

var list = ListU32{};

var node1 = ListU32.Node{ .data = 1 };

var node2 = ListU32.Node{ .data = 2 };

var node3 = ListU32.Node{ .data = 3 };

list.prepend(&node1);

list.prepend(&node2);

list.prepend(&node3);

try stdout.print("{}\n", .{list});

try stdout.print("{b}\n", .{list});

}

```

실행 결과:

```text

( 3 2 1 )

( 11 10 1 )

```

이 코드는 Zig 언어를 사용하여 단방향 연결 리스트(LinkedList)를 정의하고, 이를 사용하여 정수의 단방향 연결 리스트를 생성하여 표준 출력에 출력하는 프로그램이다.

  • 처음 두 줄은 `std` 패키지에서 `io` 모듈을 임포트하고 표준 출력 스트림을 가져온다.
  • `LinkedList` 함수는 제네릭 `LinkedList` 타입을 생성한다.
  • `T` 타입을 인자로 받아 `LinkedList` 타입을 반환한다.
  • 이 `LinkedList` 타입은 `Node`라는 구조체를 포함하며, 각각 데이터를 저장한다.
  • `LinkedList` 타입 자체는 `prepend`와 `format`이라는 메서드를 가진다.
  • `prepend` 메서드는 리스트의 맨 앞에 노드를 추가한다.
  • `format` 메서드는 리스트의 내용을 지정된 형식으로 포맷하여 출력한다.
  • `main` 함수에서는 `LinkedList` 함수를 사용하여 `ListU32`라는 타입을 생성하고, 정수 `LinkedList`를 생성한다.
  • 그 후, 세 개의 노드를 생성하고 `prepend` 메서드를 사용하여 리스트에 추가한다.
  • 마지막으로, 표준 출력에 리스트를 출력한다.

6. 3. 할당자를 사용한 문자열 반복

zig



const std = @import("std");

fn repeat(

allocator: *std.mem.Allocator,

original: []const u8,

times: usize,

) std.mem.Allocator.Error![]const u8 {

var buffer = try allocator.alloc(

u8,

original.len * times,

);

for (0..times) |i| {

std.mem.copyForwards(

u8,

buffer[(original.len * i)..],

original,

);

}

return buffer;

}

pub fn main() !void {

const stdout = std.io.getStdOut().writer();

var arena = std.heap.ArenaAllocator.init(

std.heap.page_allocator,

);

defer arena.deinit();

var allocator = arena.allocator();

const original = "Hello ";

const repeated = try repeat(

&allocator,

original,

3,

);

// "Hello Hello Hello " 출력

try stdout.print("{s}\n", .{repeated});

}


코드 설명

  • `repeat` 함수는 할당자(`allocator`), 원본 문자열(`original`), 반복 횟수(`times`)를 인자로 받아서 반복된 문자열을 반환한다.
  • `allocator.alloc` 함수를 사용하여 원본 문자열 길이와 반복 횟수를 곱한 크기의 메모리를 할당한다.
  • `for` 반복문을 사용하여 `std.mem.copyForwards` 함수를 통해 원본 문자열을 할당된 버퍼에 반복해서 복사한다.
  • `main` 함수에서는 `std.heap.ArenaAllocator`를 초기화하고, `defer arena.deinit()`를 통해 프로그램 종료 시 메모리를 해제한다.
  • `arena.allocator()`를 통해 할당자를 가져온다.
  • `repeat` 함수를 호출하여 "Hello " 문자열을 3번 반복한 결과를 얻는다.
  • `stdout.print`를 사용하여 결과를 표준 출력에 출력한다.

출력 결과```text

Hello Hello Hello

참조

[1] 웹사이트 Introduction to the Zig Programming Language https://andrewkelley[...] 2020-11-08
[2] 웹사이트 Taking the warts off C, with Andrew Kelley, creator of the Zig programming language https://sourcegraph.[...] 2024-04-18
[3] 웹사이트 Zig has all the elegant simplicity of C, minus all the ways to shoot yourself in the foot https://jaxenter.com[...] 2020-02-11
[4] 웹사이트 ARC vs. GC https://docs.element[...]
[5] 웹사이트 Guide To Java 8 Optional https://www.baeldung[...] 2022-11-28
[6] 웹사이트 Rust: Memory Management https://ggbaker.ca/p[...]
[7] 웹사이트 Allocators https://ziglearn.org[...] 2023-09-11
[8] 뉴스 Meet Zig: The modern alternative to C https://www.infoworl[...] 2023-03-09
[9] AV media The Road to Zig 1.0 - Andrew Kelley https://www.youtube.[...] ChariotSolutions 2019-05-09
[10] 웹사이트 origin of the zig programming language name. by @andrewrk https://gist.github.[...] 2024-03-13
[11] 웹사이트 The Zig Programming Language https://ziglang.org/ 2020-02-11
[12] 웹사이트 The Zig Programming Language https://ziglang.org/[...] 2020-02-11
[13] 웹사이트 Zig programming language https://sudonull.com[...] 2020-02-11
[14] 웹사이트 Keen to go _ExtInt? LLVM Clang compiler adds support for custom width integers https://www.theregis[...] 2020-04-24
[15] 웹사이트 Documentation https://ziglang.org/[...] 2020-04-24
[16] 웹사이트 Comparing Rust vs. Zig: Performance, Safety, and More https://blog.logrock[...] 2024-07-16
[17] 문서 New LLVM version 15, Zig legacy uses version 13
[18] 웹사이트 A Reply to _The Road to Zig 1.0_ https://www.gingerbi[...] 2020-02-11
[19] 웹사이트 ziglang/zig https://github.com/z[...] Zig Programming Language 2020-02-11
[20] 웹사이트 The Zig Programming Language https://ziglang.org/[...] 2020-02-11
[21] 웹사이트 ziglang/zig https://github.com/z[...] 2020-02-11
[22] 웹사이트 0.6.0 Release Notes https://ziglang.org/[...] 2020-04-19
[23] 웹사이트 'zig cc': a Powerful Drop-In Replacement for GCC/Clang - Andrew Kelley https://andrewkelley[...] 2021-05-28
[24] 웹사이트 Zig Makes Go Cross Compilation Just Work https://dev.to/krist[...] 2021-01-24
[25] 웹사이트 Jakub Konka on Twitter https://twitter.com/[...] 2021-05-28
[26] 웹사이트 Announcing the Zig Software Foundation https://ziglang.org/[...] 2021-05-28
[27] 웹사이트 Sponsor ZSF https://ziglang.org/[...] 2021-05-28
[28] 웹사이트 Why Zig has become the highest-paying programming language https://thenextweb.c[...] 2024-12-15
[29] 웹사이트 3 programming languages you need to know about https://venturebeat.[...] 2024-12-15
[30] 웹사이트 “Zig has all the elegant simplicity of C, minus all the ways to shoot yourself in the foot” https://jaxenter.com[...] JAXenter 2021-01-01
[31] 웹사이트 Tired of C? New programming language Zig aims to be more pragmatic and readable https://jaxenter.com[...] JAXenter 2021-01-01
[32] 웹사이트 New challenger joins Rust to topple C language https://www.infoworl[...] InfoWorld 2021-01-01
[33] 웹사이트 想替代 C 的 Zig 语言成立了基金会 https://tech.sina.co[...] 新浪数码 2021-01-01
[34] 웹사이트 The Zig Programming Language https://ziglang.org/ ziglang.org 2021-01-01
[35] 웹사이트 Mozilla’s Observatory, the Zig programming language, and uSens’ VR/AR SDK—SD Times news digest: Aug. 29, 2016 https://sdtimes.com/[...] SD Times 2021-01-01
[36] 웹사이트 Zig competes with C instead of depending on it https://ziglang.org/[...] ziglang.org 2021-01-01
[37] 웹사이트 Unsafe Zig is Safer than Unsafe Rust https://andrewkelley[...] andrewkelley.me 2021-01-01
[38] 웹사이트 Keen to go _ExtInt? LLVM Clang compiler adds support for custom width integers https://www.theregis[...] The Register 2021-01-01
[39] 웹사이트 Documentation - The Zig Programming Language https://ziglang.org/[...] ziglang.org 2021-01-01
[40] 웹사이트 SD Times news digest: C++20 concepts in Visual Studio 2010 version 16.3, Bootstrap to drop IE support, and Zig 0.60 released https://sdtimes.com/[...] SD Times 2021-01-01
[41] 웹사이트 A Reply to The Road to Zig 1.0 https://www.gingerbi[...] gingerBill 2021-01-01
[42] 웹사이트 ziglang/zig https://github.com/z[...] GitHub 2021-01-01
[43] 웹사이트 Tier System https://ziglang.org/[...] ziglang.org 2021-01-01
[44] 웹사이트 zig cc https://ziglang.org/[...] ziglang.org 2021-01-01
[45] 웹사이트 Add support for `zig cc` as C compiler. #13757 https://github.com/n[...] GitHub 2021-01-01
[46] 웹인용 Introduction to the Zig Programming Language https://andrewkelley[...] 2020-11-08
[47] 웹인용 Zig has all the elegant simplicity of C, minus all the ways to shoot yourself in the foot https://jaxenter.com[...] 2020-02-11
[48] 웹인용 Tired of C? New programming language Zig aims to be more pragmatic and readable https://jaxenter.com[...] 2020-04-22
[49] 웹인용 New challenger joins Rust to topple C language https://www.infoworl[...] 2020-02-11
[50] 웹인용 Zig language and C https://tech.sina.co[...] 2020-08-12
[51] 웹인용 The Zig Programming Language https://ziglang.org/ 2020-02-11
[52] 웹인용 New challenger joins Rust to topple C language https://www.infoworl[...] 2020-02-11
[53] 웹인용 Zig language and C https://tech.sina.co[...] 2020-08-12
[54] 웹인용 Sudo Null - IT News for you https://sudonull.com[...] 2020-02-11
[55] 웹인용 Keen to go _ExtInt? LLVM Clang compiler adds support for custom width integers https://www.theregis[...] 2020-04-24
[56] 웹인용 Documentation - The Zig Programming Language https://ziglang.org/[...] 2020-04-24



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com